//C09:VirtualBase.cpp
// Shows a shared subobjects via a virtual base.
#include <iostream>
#include <ostream>
using namespace std;

class Top
{
    protected:
        int x;
    public:
        Top(int n) { x = n; }
        virtual ~Top() {}
        friend ostream&
        operator<<(ostream& os, const Top& t)
        {
            return os << t.x;
        }    
};

class Left : virtual public Top
{
    protected:
        int y;
    public:
        Left(int m, int n) : Top(m) { y = n; }
};

class Right : virtual public Top
{
    protected:
        int z;
    public:
        Right(int m, int n) : Top(m) { z = n; }
};

class Bottom : public Left, public Right
{
    int w;
    public:
        Bottom(int i, int j, int k, int m)
        : Top(i), Left(0, j), Right(0, k) { w = m; }
        friend ostream&
        operator<<(ostream& os, const Bottom& b)
        {
            return os << b.x << ',' << b.y << ',' << b.z
                << ',' << b.w;
        }
};

int main(void)
{
    Bottom b(1, 2, 3, 4);
    cout << sizeof b << endl;
    cout << b << endl;
    cout << static_cast<void*>(&b) << endl;
    Top* p = static_cast<Top*>(&b);

    cout << *p << endl;
    cout << static_cast<void*>(p) << endl;
    cout << dynamic_cast<void*>(p) << endl;
}